package com.kimari.demo;

/**
 * 算法练习三
 * 设置数组是为了避免魔法值的出现
 * 在四种类型的九九乘法表中
 * 设置四个变量分别代表四种类型
 * 这也很好的防止的魔法值的出现
 * @author Reimu
 */
public class Factor {
    /**
     * 1*1= 1
     * 1*2= 2  2*2= 4
     * 1*3= 3  2*3= 6  3*3= 9
     * 1*4= 4  2*4= 8  3*4=12  4*4=16
     * 1*5= 5  2*5=10  3*5=15  4*5=20  5*5=25
     * 1*6= 6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
     * 1*7= 7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
     * 1*8= 8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
     * 1*9= 9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
     */
    public static final int FIRST = 1;
    /**
     * 1*9= 9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
     * 1*8= 8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
     * 1*7= 7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
     * 1*6= 6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
     * 1*5= 5  2*5=10  3*5=15  4*5=20  5*5=25
     * 1*4= 4  2*4= 8  3*4=12  4*4=16
     * 1*3= 3  2*3= 6  3*3= 9
     * 1*2= 2  2*2= 4
     * 1*1= 1
     */
    public static final int SECOND = 2;
    /**
     *                                                                 1*1= 1
     *                                                         1*2= 2  2*2= 4
     *                                                 1*3= 3  2*3= 6  3*3= 9
     *                                         1*4= 4  2*4= 8  3*4=12  4*4=16
     *                                 1*5= 5  2*5=10  3*5=15  4*5=20  5*5=25
     *                         1*6= 6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
     *                 1*7= 7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
     *         1*8= 8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
     * 1*9= 9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
     */
    public static final int THIRD = 3;
    /**
     * 1*9= 9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
     *         1*8= 8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
     *                 1*7= 7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
     *                         1*6= 6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
     *                                 1*5= 5  2*5=10  3*5=15  4*5=20  5*5=25
     *                                         1*4= 4  2*4= 8  3*4=12  4*4=16
     *                                                 1*3= 3  2*3= 6  3*3= 9
     *                                                         1*2= 2  2*2= 4
     *                                                                 1*1= 1
     */
    public static final int FOURTH = 4;


    public static int[] nums;

    static {
        nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
    }

    /**
     * 计算一个数的阶乘
     * @param num 阶乘数
     * @return 阶乘结果
     */
    public static int factorial(int num) {
        if (num == 0) {
            return 1;
        }
        //使用了递归的思想
        return num * factorial(num - 1);
    }

    /**
     * 使用4种方法来实现九九乘法表
     * 后两种待优化
     * @param n 判断参数
     */
    public static void multiTable(int n) {
        if (n == FIRST) {
            for (int i = 1; i <= nums.length; i++) {
                for (int j = 1; j <=i; j++) {
                    System.out.print(j + "×" + i + "=" + i * j + "\t");
                }
                System.out.println();
            }
        } else if (n == SECOND) {
            for (int i = nums.length; i >= 1; i--) {
                for (int j = 1; j <= i ; j++) {
                    System.out.print(j + "×" + i + "=" + i * j + "\t");
                }
                System.out.println();
            }
        } else if (n == THIRD) {
            for (int i = 1; i <= nums.length; i++) {
                for (int k = 1; k < nums.length + 1 - i; k++) {
                    System.out.print("\t");
                }
                for (int j = 1; j <= i; j++) {
                    System.out.print(j + "×" + i + "=" + i * j + "\t");
                }
                System.out.println();
            }
        } else if (n == FOURTH) {
            for (int i = 1; i <= nums.length; i++) {
                for (int k = 2; k <= i; k++) {
                    System.out.print("\t");
                }
                for (int j = i; j <= nums.length; j++) {
                    System.out.print(j + "×" + i + "=" + i * j + "\t");
                }
                System.out.println();
            }
        }
    }
}
